package timingAttack;

import java.math.BigInteger;

public class RSA {
	
	BigInteger d, N;
	
	
	public BigInteger decrypt(BigInteger message) {
		return message.modPow(d, N);
		
	}
		
	public long decrypt1(BigInteger message, int i){
		BigInteger z;
		BigInteger zz;
		BigInteger zC=null;
		
		long nano;
		z = message;
		nano=System.nanoTime();
		
		zz= z.multiply(z).mod(N);
		z=zz;
		
		if (d.testBit(i)){
		
			zC = z.multiply(message).mod(N);
			z=zC;
		}
		
		return System.nanoTime()-nano;
		
	}
	
//	public static void main(String[] args) {
//		
//		RSA rsa = new RSA();
//		TA ta = new TA();
//		
//		for (int i=rsa.d.bitLength()-2;i>-1;i--){
//			
//			long timeDecryptedE = rsa.decrypt1(ta.E,i);
//			long timeDecryptedF = rsa.decrypt1(ta.F,i);
//			
//			if (timeDecryptedE < timeDecryptedF){
//			
//				d_recover = d_recover+"1";
//				if (!rsa.d.testBit(i)){// if the exact bit is 0, it’s error
//					k++;
//				}
//				
//			}
//			else {
//			
//				if (!rsa.d.testBit(i)){// if the exact bit is 1, it’s error
//					k++;
//				}
//				
//				d_recover = d_recover+"0";
//			
//			}
//			
//		}
//			
//		System.out.println(k);
//		System.out.println(d_recover);
//	} 
		
}

class TA {
	BigInteger E;
	BigInteger F;
}
